using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public PerfilVO getPerfil(int? idPerfil, string perfil)
		{
			PerfilVO perfilVO = null;
			List<PerfilVO> listPerfilVOs = getPerfils(idPerfil, perfil, null);
			if (listPerfilVOs != null && listPerfilVOs.Count > 0)
			{
				perfilVO = listPerfilVOs[0];
			}
			return perfilVO;
		}

		public PerfilVO getPerfil(int? idPerfil)
		{
			return getPerfil(idPerfil, null);
		}

		public List<PerfilVO> getPerfils()
		{
			return getPerfils(null, null, null);
		}

		public List<PerfilVO> getPerfils(int? idPerfil)
		{
			return getPerfils(idPerfil, null, null);
		}

		public List<PerfilVO> getPerfils(int? idPerfil, string perfil)
		{
			return getPerfils(idPerfil, perfil, null);
		}

        public List<PerfilVO> getPerfils(int? idPerfil, string perfil, int? idFilial)
		{
            return getPerfils(idPerfil, perfil, null, idFilial);
        }

		public List<PerfilVO> getPerfils(int? idPerfil, string perfil, string perfilExato, int? idFilial)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT per.idPerfil as per_idPerfil, per.perfil as per_perfil, per.idFilial as per_idFilial, fil.filial as fil_filial, per.Cadastro as per_Cadastro, per.CadastradoPor as per_CadastradoPor, per.Edicao as per_Edicao, per.EditadoPor as per_EditadoPor  ");
			query.AppendLine("FROM perfil as per LEFT OUTER JOIN filial as fil on per.idFilial=fil.idFilial  ");
			if (idPerfil != null)
			{
				query.AppendLine(where + "per.idPerfil=@idPerfil ");
				where = "AND ";
			}
			if (perfil != null)
			{
				query.AppendLine(where + "per.perfil LIKE @perfil ");
				where = "AND ";
			}
			if (idFilial != null)
			{
				query.AppendLine(where + "per.idFilial=@idFilial ");
				where = "AND ";
			}
            if (perfilExato != null)
            {
                query.AppendLine(where + "per.perfil=@perfilExato ");
                where = "AND ";
            }


			query.AppendLine("ORDER BY per.perfil ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idPerfil!= null) cmd.Parameters.Add(getParameter(cmd, "@idPerfil", idPerfil));
			if (perfil!= null) cmd.Parameters.Add(getParameter(cmd, "@perfil", "%"+perfil+"%"));
			if (idFilial!= null) cmd.Parameters.Add(getParameter(cmd, "@idFilial", idFilial));
            if (perfilExato!= null) cmd.Parameters.Add(getParameter(cmd, "@perfilExato", perfilExato));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PerfilVO> listPerfil = new List<PerfilVO>();

				while (reader.Read())
				{
					PerfilVO perfilVO = PerfilVO.CreateVO();
					perfilVO.idPerfil = reader.GetInt32(reader.GetOrdinal("per_idPerfil"));
					perfilVO.perfil = reader.GetString(reader.GetOrdinal("per_perfil"));
					perfilVO.idFilial = reader.GetInt32(reader.GetOrdinal("per_idFilial"));
					if (!reader.IsDBNull(reader.GetOrdinal("fil_filial")))
						perfilVO.idFilialVO.filial = reader.GetString(reader.GetOrdinal("fil_filial"));
					perfilVO.cadastro = reader.GetDateTime(reader.GetOrdinal("per_Cadastro"));
					perfilVO.cadastradoPor = reader.GetString(reader.GetOrdinal("per_CadastradoPor"));
					perfilVO.edicao = reader.GetDateTime(reader.GetOrdinal("per_Edicao"));
					perfilVO.editadoPor = reader.GetString(reader.GetOrdinal("per_EditadoPor"));


					listPerfil.Add(perfilVO);
				}
				reader.Close();
				return listPerfil;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setPerfil(PerfilVO perfilVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE perfil ");
			query.AppendLine("SET perfil=@perfil, idFilial=@idFilial,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idPerfil=@idPerfil ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilVO.idPerfil));
			cmd.Parameters.Add(getParameter(cmd, "@perfil", perfilVO.perfil));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", perfilVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", perfilVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", perfilVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newPerfil(PerfilVO perfilVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO perfil ");
			query.AppendLine("  ( perfil, idFilial, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @perfil, @idFilial, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@perfil", perfilVO.perfil));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", perfilVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", perfilVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", perfilVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('perfil') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delPerfil(PerfilVO perfilVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM perfil ");
			query.AppendLine("WHERE idPerfil=@idPerfil ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilVO.idPerfil));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountPerfilxIdFilial(int? idFilial)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idFilial) as ocorrencias FROM perfil WHERE IdFilial=@IdFilial ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdFilial", idFilial));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
